WOLF core
WOLF: A Modular Estimation Framework for Robotics
XXXXXXXXXXXXXXXXXXXXXXXXvoid(0)" frameborder="0" name="MSearchResults" id="MSearchResults">
folder_registry.h
Go to the documentation of this file.
1// WOLF - Copyright (C) 2020-2026
2// Institut de Robòtica i Informàtica Industrial, CSIC-UPC.
3// Authors: Joan Solà Ortega (jsola@iri.upc.edu) and
4// Joan Vallvé Navarro (jvallve@iri.upc.edu)
5// All rights reserved.
6//
7// This file is part of WOLF: http://www.iri.upc.edu/wolf
8// WOLF is free software: you can redistribute it and/or modify
9// it under the terms of the GNU General Public License version 3
10// as published by the Free Software Foundation.
11//
12// This program is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15// GNU General Public License for more details.
16//
17// You should have received a copy of the GNU General Public License
18// along with this program. If not, see <http://www.gnu.org/licenses/>.
19#pragma once
20
21#include "core/utils/unused.h"
22
23// std
24#include <string>
25#include <map>
26#include <vector>
27#include <iostream>
28#include <iomanip>
29
30namespace wolf
31{
33{
34 private:
35 std::map<std::string, std::string> folders_;
36
37 public:
38 static bool registerFolder(const std::string& _plugin, const std::string _folder);
39 static bool unregisterFolder(const std::string& _plugin);
40 static bool isFolderRegistered(const std::string& _plugin);
41 static void printAddress();
42 static std::vector<std::string> getRegisteredFolders();
43 static void appendRegisteredFolders(std::vector<std::string>& _folders);
44
45 // Singleton ---------------------------------------------------
46 // This class is a singleton. The code below guarantees this.
47 // See: http://stackoverflow.com/questions/1008019/c-singleton-design-pattern
48 private:
49 static FolderRegistry& get();
50
51 public:
53 void operator=(FolderRegistry const&) = delete;
54
55 private:
58};
59
60inline FolderRegistry::FolderRegistry()
61{
62 // std::cout << " FolderRegistry constructor " << std::endl;
63}
64
65inline FolderRegistry::~FolderRegistry()
66{
67 // std::cout << " FolderRegistry destructor " << std::endl;}
68}
69
70inline bool FolderRegistry::registerFolder(const std::string& _plugin, const std::string _folder)
71{
72 // Unregister plugin-folder if registered with different folder
73 if (get().isFolderRegistered(_plugin) and get().folders_.at(_plugin) != _folder)
74 {
75 std::cout << std::setw(31) << std::left << "FolderRegistry"
76 << " XXX unregister old '" << _plugin << "' folder: " << get().folders_.at(_plugin) << std::endl;
77 get().unregisterFolder(_plugin);
78 }
79
80 // register plugin-folder if not registered
81 if (not get().isFolderRegistered(_plugin))
82 {
83 get().folders_.insert(std::pair<std::string, std::string>(_plugin, _folder)).second;
84 std::cout << std::setw(31) << std::left << "FolderRegistry"
85 << " <-- registered '" << _plugin << "' folder: " << _folder << std::endl;
86 return true;
87 }
88
89 return false;
90}
91
92inline bool FolderRegistry::unregisterFolder(const std::string& _plugin)
93{
94 if (get().isFolderRegistered(_plugin))
95 return get().folders_.erase(_plugin) == 1;
96 else
97 std::cout << std::setw(31) << std::left << "FolderRegistry"
98 << " ERROR trying to unregister " << _plugin << ": Not registered." << std::endl;
99 return false;
100}
101
102inline bool FolderRegistry::isFolderRegistered(const std::string& _plugin)
103{
104 return get().folders_.count(_plugin);
105}
106
107inline FolderRegistry& FolderRegistry::get()
108{
109 static FolderRegistry instance_;
110 return instance_;
111}
112
114{
115 std::cout << "FolderRegistry address: " << &get() << std::endl;
116}
117
118inline std::vector<std::string> FolderRegistry::getRegisteredFolders()
119{
120 std::vector<std::string> vec;
121 for (auto pair : get().folders_) vec.push_back(pair.second);
122 return vec;
123}
124
125inline void FolderRegistry::appendRegisteredFolders(std::vector<std::string>& _folders)
126{
127 for (auto pair : get().folders_) _folders.push_back(pair.second);
128}
129
130} // namespace wolf
131
132#define WOLF_REGISTER_FOLDER(plugin, folder) \
133 namespace \
134 { \
135 const bool WOLF_UNUSED folder##Registered = FolderRegistry::registerFolder(plugin, folder); \
136 }
Definition: folder_registry.h:33
static void printAddress()
Definition: folder_registry.h:113
static std::vector< std::string > getRegisteredFolders()
Definition: folder_registry.h:118
static bool isFolderRegistered(const std::string &_plugin)
Definition: folder_registry.h:102
FolderRegistry(const FolderRegistry &)=delete
static bool registerFolder(const std::string &_plugin, const std::string _folder)
Definition: folder_registry.h:70
static void appendRegisteredFolders(std::vector< std::string > &_folders)
Definition: folder_registry.h:125
static bool unregisterFolder(const std::string &_plugin)
Definition: folder_registry.h:92
void operator=(FolderRegistry const &)=delete
Definition: capture_base.h:23